/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package olimpus.genericos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/** 
 *
 * @author Leonardo
 */
public class FuncionesGenericas
{  
    public static void limpiarReportesTemporales(String xRuta) throws Exception
    {
        try
        {
            File directorio = new File(xRuta);

            if(directorio.exists())
            {
                File[] files = directorio.listFiles();

                for(int i=0; i<files.length; i++)
                {
                    Date fecha = new Date(files[i].lastModified());
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                    String display = sdf.format(fecha);

                    Calendar fechaSis = FuncionesFecha.convertirStringACalendar(FuncionesFecha.getFechaSistema());
                    Calendar fechaFile = FuncionesFecha.convertirStringACalendar(display);
                    double diferencia = FuncionesFecha.getDiferenciaEntreFechas(fechaFile, fechaSis, "D");

                    if(diferencia >= PropiedadesINI.getDiasToleranciaReportes())
                    {
                        if(files[i].isDirectory())
                        {
                            limpiarReportesTemporales(files[i].getPath());
                            files[i].delete();
                        }
                        else
                        {
                            files[i].delete();
                        }
                    }                
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }
    }
    
    public static String stringToHTMLString(String string)
    {
        StringBuilder sb = new StringBuilder(string.length());
        // true if last char was blank
        boolean lastWasBlankChar = false;
        int len = string.length();
        char c;

        for (int i = 0; i < len; i++)
        {
            c = string.charAt(i);
            if (c == ' ')
            {
                // blank gets extra work,
                // this solves the problem you get if you replace all
                // blanks with &nbsp;, if you do that you loss
                // word breaking
                //if (lastWasBlankChar) {
                //    lastWasBlankChar = false;
                //    sb.append("&nbsp;");
                //} else {
                //    lastWasBlankChar = true;
                    sb.append(' ');
                //}
            }
            else
            {
                lastWasBlankChar = false;
                //
                // HTML Special Chars
                if (c == '"')
                {
                    sb.append("&quot;");
                }
                else if (c == '&')
                {
                    sb.append("&amp;");
                }
                else if (c == '<')
                {
                    sb.append("&lt;");
                } 
                else if (c == '>')
                {
                    sb.append("&gt;");
                }
                else if (c == '\n') // Handle Newline
                {
                    sb.append("&lt;br/&gt;");
                }
                else
                {
                    int ci = 0xffff & c;
                    if (ci < 160) // nothing special only 7 Bit
                    {
                        sb.append(c);
                    } 
                    else
                    {
                        // Not 7 Bit use the unicode system
                        sb.append("&#");
                        sb.append(new Integer(ci).toString());
                        sb.append(';');
                    }
                }
            }
        }
        return sb.toString();
    }

    public static int calculoDigitoVerificador(String xCi) throws Exception
    {
        try
        {
            xCi=xCi.trim();

            int digitoVerificador = 0;
            int[] col = {2,9,8,7,6,3,4};
            
            if(xCi.trim().length() == 6 || xCi.trim().length() == 7)
            {
                if(xCi.trim().length() == 6)
                {
                    xCi = "0" + xCi;
                }
                for(int i=0; i<col.length; i++)
                {
                    try
                    {
                        digitoVerificador += col[i] * Integer.parseInt(String.valueOf(xCi.charAt(i)));
                    }
                    catch (NumberFormatException nfe)
                    {
                        throw new Exception("#alerta: Atenci&oacute;n, la cedula tiene que contener solo numeros." + xCi);
                    }
                }

                digitoVerificador = 10 - digitoVerificador % 10;

                if(digitoVerificador == 10)
                {
                    digitoVerificador = 0;
                }
            }
            else
            {
                return -1;
            }

            return digitoVerificador;
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }
    }

    public static String formatoCi(String xCi) throws Exception
    {
        String ciMasDIgito = "";
        String ciIntermedio = "";
        String ci = "";
        
        int digito = -1;

        try
        {
            digito = calculoDigitoVerificador(xCi);

            ci = xCi.trim();

            if (ci.length() == 7)
            {
                ciIntermedio = ci.substring(0, 1) + "." + ci.substring(1, 4) + "." + ci.substring(4, 7);
            }
            else
            {
                ciIntermedio = ci.substring(0, 3) + "." + ci.substring(3,6);
            }

            ciMasDIgito = ciIntermedio + "-" + digito;

            return ciMasDIgito;
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }
    }

    public static String codificarStringJavaAStringJavascript(String xTexto) throws Exception
    {        
        String codificado = "";

        try
        {
            if (xTexto == null)
            {
                codificado = "null";
            }
            else
            {
                codificado = new String(xTexto.getBytes("UTF-8"));
            }

            codificado = codificado.replaceAll("'", "-");
            codificado = codificado.replaceAll("\n", " ");
            codificado = codificado.replaceAll("/\r/g", "<br>");

            codificado = codificado.replaceAll("\\n"," ");
            codificado = codificado.replaceAll("\\t"," ");
            codificado = codificado.replaceAll("\\r"," ");
            codificado = codificado.replaceAll("\\v"," ");

            codificado = codificado.replaceAll("\\chr(9)"," ");
            codificado = codificado.replaceAll("\\chr(10)"," ");
            codificado = codificado.replaceAll("\\chr(13)"," ");
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }

        return codificado;
    }

    public static String escapeHTML(String s) throws Exception
    {
        StringBuilder sb = new StringBuilder();
        int n = s.length();
       
        try
        {
            for (int i = 0; i < n; i++)
            {
              char c = s.charAt(i);
              switch (c)
              {
                 case '<': sb.append("&lt;"); break;
                 case '>': sb.append("&gt;"); break;
                 case '&': sb.append("&amp;"); break;
                 case '"': sb.append("&quot;"); break;
                 case 'í': sb.append("&iacute;");break;
                 case 'Í': sb.append("&Iacute;");break;
                 case 'ì': sb.append("&igrave;");break;
                 case 'Ì': sb.append("&Igrave;");break;
                 case 'î': sb.append("&icirc;");break;
                 case 'Î': sb.append("&Icirc;");break;
                 case 'ï': sb.append("&iuml");break;
                 case 'Ï': sb.append("&Iuml;");break;
                 case 'á': sb.append("&aacute;");break;
                 case 'à': sb.append("&agrave;");break;
                 case 'À': sb.append("&Agrave;");break;
                 case 'â': sb.append("&acirc;");break;
                 case 'Â': sb.append("&Acirc;");break;
                 case 'ä': sb.append("&auml;");break;
                 case 'Ä': sb.append("&Auml;");break;
                 case 'å': sb.append("&aring;");break;
                 case 'Å': sb.append("&Aring;");break;
                 case 'æ': sb.append("&aelig;");break;
                 case 'Æ': sb.append("&AElig;");break;
                 case 'ç': sb.append("&ccedil;");break;
                 case 'Ç': sb.append("&Ccedil;");break;
                 case 'é': sb.append("&eacute;");break;
                 case 'É': sb.append("&Eacute;");break;
                 case 'è': sb.append("&egrave;");break;
                 case 'È': sb.append("&Egrave;");break;
                 case 'ê': sb.append("&ecirc;");break;
                 case 'Ê': sb.append("&Ecirc;");break;
                 case 'ë': sb.append("&euml;");break;
                 case 'Ë': sb.append("&Euml;");break;
                 case 'ó': sb.append("&oacute;");break;
                 case 'ô': sb.append("&ocirc;");break;
                 case 'Ô': sb.append("&Ocirc;");break;
                 case 'ö': sb.append("&ouml;");break;
                 case 'Ö': sb.append("&Ouml;");break;
                 case 'ø': sb.append("&oslash;");break;
                 case 'Ø': sb.append("&Oslash;");break;
                 case 'ß': sb.append("&szlig;");break;
                 case 'ù': sb.append("&ugrave;");break;
                 case 'Ù': sb.append("&Ugrave;");break;
                 case 'û': sb.append("&ucirc;");break;
                 case 'Û': sb.append("&Ucirc;");break;
                 case 'ü': sb.append("&uuml;");break;
                 case 'Ü': sb.append("&Uuml;");break;
                 case '®': sb.append("&reg;");break;
                 case '©': sb.append("&copy;");break;
                 case '€': sb.append("&euro;"); break;
                 // be carefull with this one (non-breaking whitee space)
                 case ' ': sb.append("&nbsp;");break;

                 default:  sb.append(c); break;
              }
            }
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }

        return sb.toString();
    }

    /**
     * Redondear un número a n Decimales.
     * @param xNumero
     * @param xDecimales
     * @return
     */
    public static double redondear(double xNumero, int xDecimales) throws Exception
    {
        try
        {
            return Math.round(xNumero * Math.pow(10, xDecimales)) / Math.pow(10, xDecimales);
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }
    }

    /**
     * Truncar un número a n Decimales.
     * @param xNumero
     * @param xDecimales
     * @return
     */
    public static double truncar(double xNumero, int xDecimales) throws Exception
    {
        double num = 0;

        try
        {
            String cero = "";
            String numero = String.valueOf(xNumero);
            for (int i = 0; i<xDecimales; i++) cero += "0";

            if(numero.indexOf(".") > 0)
            {
                numero += cero;
                if(xDecimales == 0) numero = numero.substring(0, numero.indexOf(".")); else numero = numero.substring(0, numero.indexOf(".") + xDecimales + 1);
            }

            num = Double.parseDouble(numero);
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }

        return num;
    }

    /**
     * Truncar un número a n Decimales.
     * @param xNumero
     * @param xDecimales
     * @return
     */
    public static String truncarString(double xNumero, int xDecimales) throws Exception
    {
        String numero = "";

        try
        {
            String cero = "";
            numero = String.valueOf(xNumero);

            for (int i = 0; i<xDecimales; i++) cero += "0";

            if(numero.indexOf(".") > 0)
            {
                numero += cero;
                if(xDecimales == 0) numero = numero.substring(0, numero.indexOf(".")); else numero = numero.substring(0, numero.indexOf(".") + xDecimales + 1);
            }
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }

        return numero;
    }
    
    public static String truncarString(String numero, int xDecimales) throws Exception
    {
        try
        {
            String cero = "";

            for (int i = 0; i<xDecimales; i++) cero += "0";

            if(numero.indexOf(".") > 0)
            {
                numero += cero;
                if(xDecimales == 0) numero = numero.substring(0, numero.indexOf(".")); else numero = numero.substring(0, numero.indexOf(".") + xDecimales + 1);
            }
            else
            {
                numero += ".00";
            }
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }

        return numero;
    }

    public static String textoDeImporte(double xImporte) throws Exception
    {
        System.out.println("xImporte = " + xImporte);
        String texto = "";
        int millones, miles, unidades, centesimos, aux, unidad = 0;
        long ld_xx, ll_aux, ll_aux1;
        double ld_1, importe;

        try
        {
            ld_1 = xImporte;
            System.out.println("ld_1 = " + ld_1);
            importe = redondear(ld_1,2);
            System.out.println("importe = " + importe);


            millones = (int) importe / 1000000;
            miles = (int)(importe - millones * 1000000)/1000;
            unidades = (int)(importe - (millones * 1000000 + miles * 1000));
            System.out.println("millones = " + millones);
            System.out.println("miles = " + miles);
            System.out.println("unidades = " + unidades);

            ld_xx = millones * 1000000 + miles * 1000 + unidades;
            ll_aux = (long)(importe * 100.0);
            ll_aux1 = ld_xx * 100;
            centesimos = (int)(ll_aux - ll_aux1);
            System.out.println("ld_xx = " + ld_xx);
            System.out.println("ll_aux = " + ll_aux);
            System.out.println("ll_aux1 = " + ll_aux1);
            System.out.println("centesimos = " + centesimos);

            System.out.println("texto 1= " + texto);
            if (millones != 0)
            {
                texto = texto + numeroEnLetra(millones, "");
                System.out.println("texto 2 = " + texto);
                if (millones>1)
                {
                    texto = texto + " millones";
                }
                else
                {
                    texto = texto + " millon";
                }
                System.out.println("texto 3= " + texto);
            }

            if (miles != 0) texto = texto + numeroEnLetra(miles, "") + " mil";

            System.out.println("texto 4=" + texto);
            if (unidades != 0)
            {
                texto = texto + numeroEnLetra(unidades, "unidades");
                aux = unidad - (int)((unidad/100)*100);
                unidad = aux - (int)((aux/10)*10);

                if (unidad==1 && aux != 11) texto = texto + "o";
            }
            System.out.println("texto 5= " + texto);

            if (centesimos != 0)
            {
                texto = texto + " con "+ redondear(centesimos,2) + "/100.-";
            }
            else
            {
                texto = texto + "0.00/100.-";
            }
            System.out.println("texto final= " + texto);

            return texto;
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }
    }

    /*
     * Con la siguiente consulta en la base obtenemos los codigos de error en español
     *  Use Master
        SELECT * 
        FROM sysmessages
        where msglangid = 3082
     */
    public static String obtenerErrorPersistencia(SQLException xEx) throws Exception
    {
        String error = "";
        try
        {
            System.out.println("## JAVA LOG: " + xEx.getMessage());
            // Obtengo el codigo de error
            switch(xEx.getErrorCode())
            {
                case 109:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo al insertar, Hay más columnas en la instrucción INSERT que valores en la cláusula VALUES.";
                    break;
                case 110:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo al insertar, Hay menos columnas en la instrucción INSERT que valores en la cláusula VALUES.";
                    break;
                case 220:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo por desbordamiento aritmético.";
                    break;
                case 232:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo por desbordamiento aritmético.";
                    break;
                case 241:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo al convertir una cadena de caracteres en fecha y/u hora.";
                    break;
                case 245:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo en conversion de datos.";
                    break;
                case 265:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo porque el nombre de una de las columnas no coincide con el nombre real de la tabla ";
                    break;
                case 515:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo porque no se puede insertar el valor NULL.";
                    break;
                case 547:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo al insertar o eliminar un registro que esta referenciado";
                    break;
                case 2209:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo en sintaxis de la consulta";
                    break;
                case 2223:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo en sintaxis de la consulta";
                    break;
                case 2248:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo en sintaxis de la consulta";
                    break;
                case 2256:
                    error = "Error Nro: " + xEx.getErrorCode() + ". Se produjo en sintaxis de la consulta";
                    break;
                default:
                    error = "Error Nro: " + xEx.getErrorCode()+ " " + xEx.getMessage();
                    break;

            }
            return error;
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }
    }

    public static String formatearDouble(double xNumero, int Decimales) throws Exception
    {
        String resultado = "0.00";

        try
        {
            BigDecimal numero = new BigDecimal(xNumero);
            DecimalFormat formatter = new DecimalFormat("#.##");

            resultado = formatter.format(numero);
            resultado = resultado.replace(",", ".");
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }

        return resultado;
    }

    public static boolean esNumerico(String xNum) throws Exception
    {
        try
        {
            Long.parseLong(xNum);
        }
        catch(NumberFormatException nfe)
        {
            return false;
        }
        return true;
    }

    private static String numeroEnLetra(int xNumero, String xTipoParametro) throws Exception
    {
        String texto = "";
        int centena, decena, unidad, aux;
        boolean imprimoUnidad= true;

        try
        {
            centena = (int) xNumero / 100;
            decena = (int) (xNumero - centena * 100) / 10;
            unidad = xNumero - centena * 100 - decena * 10;

            System.out.println("centena = " + centena);
            System.out.println("decena = " + decena);
            System.out.println("unidad = " + unidad);
            System.out.println("texto antes  en NumeroEnLetra= " + texto);

            if (centena != 0)
            {
                if (xNumero == 100)
                {
                    texto = " cien";
                    return texto;
                }

                switch(centena)
                {
                    case 1:
                        texto = texto + " ciento ";
                        break;
                    case 2:
                        texto = texto + " doscientos ";
                        break;
                    case 3:
                        texto = texto + " trescientos ";
                        break;
                    case 4:
                        texto = texto + " cuatrocientos ";
                        break;
                    case 5:
                        texto = texto + " quinientos ";
                        break;
                    case 6:
                        texto = texto + " seiscientos ";
                        break;
                    case 7:
                        texto = texto + " setecientos ";
                        break;
                    case 8:
                        texto = texto + " ochocientos ";
                        break;
                    case 9:
                        texto=texto+" novecientos ";
                        break;
                    default:
                        break;
                }
            }

            if (decena != 0)
            {
                if(unidad != 0)
                {
                    switch(decena)
                    {
                        case 1:
                            switch(unidad)
                            {
                                case 1:
                                texto=texto+" once";
                                break;
                                case 2:
                                texto=texto+" doce";
                                break;
                                case 3:
                                texto=texto+" trece";
                                break;
                                case 4:
                                texto=texto+" catroce";
                                break;
                                case 5:
                                texto=texto+" quince";
                                break;
                                default:
                                texto=texto+" dieci";
                                break;
                            }
                            if(xTipoParametro.equalsIgnoreCase("unidades"))
                                imprimoUnidad= false;
                            break;
                        case 2:
                            texto = texto + " veinti";
                            break;
                        case 3:
                            texto = texto + " treinta y ";
                            break;
                        case 4:
                            texto = texto + " cuarenta y ";
                            break;
                        case 5:
                            texto = texto + " cincuenta y ";
                            break;
                        case 6:
                            texto = texto + " sesenta y ";
                            break;
                        case 7:
                            texto = texto + " setenta y ";
                            break;
                        case 8:
                            texto = texto + " ochenta y ";
                            break;
                        case 9:
                            texto=texto+" noventa y ";
                            break;
                        default:
                            break;
                    }
                }
                else
                {
                    switch(decena)
                    {
                        case 1:
                            texto = texto + " diez";
                            break;
                        case 2:
                            texto = texto + " veinte";
                            break;
                        case 3:
                            texto = texto + " treinta";
                            break;
                        case 4:
                            texto = texto + " cuarenta";
                            break;
                        case 5:
                            texto = texto + " cincuenta";
                            break;
                        case 6:
                            texto = texto + " sesenta";
                            break;
                        case 7:
                            texto = texto + " setenta";
                            break;
                        case 8:
                            texto = texto + " ochenta";
                            break;
                        case 9:
                            texto=texto+" noventa";
                            break;
                        default:
                            break;
                    }
                }
                
            }

            if (unidad != 0 && imprimoUnidad)
            {
                switch(unidad)
                {
                    case 1:
                        texto = texto + "uno";
                        break;
                    case 2:
                        texto = texto + "dos";
                        break;
                    case 3:
                        texto = texto + "tres";
                        break;
                    case 4:
                        texto = texto + "cuatro";
                        break;
                    case 5:
                        texto = texto + "cinco";
                        break;
                    case 6:
                        texto = texto + "seis";
                        break;
                    case 7:
                        texto = texto + "siete";
                        break;
                    case 8:
                        texto = texto + "ocho";
                        break;
                    case 9:
                        texto=texto+"nueve";
                        break;
                    default:
                        break;
                }
            }


            System.out.println("texto final en NumeroEnLetra= " + texto);
            return texto;
        }
        catch(Exception ex)
        {
            throw new Exception("Genericos--> " + ex.getMessage());
        }
    }

    /**
     * Copia un solo archivo
     */
    public static void copiarArchivo(String xRutaOrigen, String xRutaDestino) throws IOException
    {
        File archivoOrigen = new File(xRutaOrigen);
        File archivoDestino = new File(xRutaDestino);

        InputStream in = new FileInputStream(archivoOrigen);
        OutputStream out = new FileOutputStream(archivoDestino);

        byte[] buf = new byte[1024];
        int len;

        while ((len = in.read(buf)) > 0)
        {
            out.write(buf, 0, len);
        }
        
        in.close();
        out.close();
    } 

    public static String getHash(byte[] buffer, String xAlgoritmo) throws NoSuchAlgorithmException
    {
        byte[] digest = null;
        MessageDigest md;
        String hash = "";
        md = MessageDigest.getInstance(xAlgoritmo);
        md.update(buffer);
        digest = md.digest();
        for(byte aux : digest)
        {   
            int b = aux & 0xff;
            if (Integer.toHexString(b).length() == 1) hash += "0";
            hash += Integer.toHexString(b);
        }
        return hash;
    }
    
    public static String formatoNumero(double xNumero) throws Exception
    {
        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator('.');
        symbols.setGroupingSeparator(',');
        DecimalFormat formatter = new DecimalFormat("#,##0.###", symbols);
        
        return truncarString(formatter.format(xNumero), 2);
    }
    
    public static boolean validarCI(String ci) throws Exception
    {
        String codigo;
        String digito;
        int digitoVerificador;
        
        
        codigo = ci.substring(0, ci.length()-1);
        digito = ci.substring(ci.length()-1, ci.length());
        digitoVerificador = calculoDigitoVerificador(codigo);

        if(digitoVerificador == Integer.parseInt(digito))
            return true;
        else
            return false;
    }
    
    public static boolean validarRuc(String rut)
    {
        int digito;
        int digitoVerificador = 0;
        int[] col = {4,3,2,9,8,7,6,5,4,3,2};
        
        if(rut.length() == 12)
        {
            digito = Integer.parseInt(rut.substring(rut.length()-1));
            
            for(int i=0; i<col.length; i++)
                digitoVerificador += col[i] * Integer.parseInt(String.valueOf(rut.charAt(i)));
            
            digitoVerificador = 11 - (digitoVerificador % 11);
            
            if(digitoVerificador == 11)
                digitoVerificador = 0;
            else if(digitoVerificador == 10)
                digitoVerificador = 1;
            
            if(digitoVerificador == digito)
                return true;
            else
                return false;
        }
        
        return false;
    }
    
    public static int calcularDigitoRuc(String numero) 
    {
        int[] digitos = new int[numero.length()];
        int factor;
        int suma = 0;
        int modulo = 0;
        int digitoVerificador = -1;
        
        try 
        {
            factor=2;
            int total = digitos.length-1;
            
            for (int i = total; i >= 0 ; i--) 
            {
                digitos[i] = Integer.parseInt("" + numero.charAt(i));
                suma = suma + (digitos[i]*factor);
                factor = factor==7? 2 : (factor+1); 
            }

            //calculo el modulo 11 de la suma
            modulo = suma % 11;
            digitoVerificador = 11 - modulo;

            if(digitoVerificador==11)
            {
                digitoVerificador = 0;
            }

            if(digitoVerificador==10)
            {
                digitoVerificador = 1;
            }

        } 
        catch (Exception e) 
        {
            digitoVerificador = -1;
        }
        
        return digitoVerificador;
    }
    
    public static String getEstiloTablaMail()
    {
        return "a:link{color:#4285F4;font-weight:700;text-decoration:none}a:active,a:hover,a:visited{color:#4285F4;text-decoration:underline}table{background:#eaebec;border:#ccc 1px solid;border-radius:3px;color:#666;font-family:Arial,Helvetica,sans-serif;font-size:10px;margin:20px;text-shadow:1px 1px 0 #fff;width:97%}table th{background:#ededed;border-bottom:1px solid #e0e0e0;border-top:1px solid #fafafa;padding:4px}table tr{padding-left:10px;text-align:center}table td{background:#fafafa;border-bottom:1px solid #e0e0e0;border-left:1px solid #e0e0e0;border-top:1px solid #fff;padding:8px}table .der{text-align:right}table .izq{text-align:left}table .totales{background:#CCC}";
    }
    
    public static double getUnidadIndexada()
    {
        double unidadIndexada = 2.7;
        
        try
        {
            URL url = new URL("http://www.brou.com.uy/web/guest/institucional/cotizaciones");
            URLConnection conn = url.openConnection();

            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestProperty("Content-type", "application/text");
            conn.connect();

            //Creamos el objeto con el que vamos a leer
            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String inputLine;

            int index = 0;

            while ((inputLine = in.readLine()) != null)
            {
                if(index == 381)
                {
                    try
                    {
                        unidadIndexada = Double.parseDouble(inputLine.replace("<td class=\"sale\">", "").replace("</td>", ""));
                        break;
                    }
                    catch(Exception ex)
                    {
                        unidadIndexada = 2.7;
                    }
                }

                index++;
            }

            in.close();
        }
        catch(Exception ex)
        {
            unidadIndexada = 2.7;
        }
        
        return unidadIndexada;
    }
}
